package dao;

import com.sun.rowset.CachedRowSetImpl;
import util.JdbcUtil;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * 因为LAST_INSERT_ID()函数是对当前连接有效的，所以我们需要在BaseDao中保存一个Connection对象
 */
public class BaseDao {
    /**
     * 增删改，如果增加成功，返回增加的数据的id
     * 如果是修改或删除，返回受影响的行数
     * 失败返回-1
     *
     * @param sql
     * @param args
     * @return id | rows | -1
     */
    public int updateData(String sql, Object... args) {
        if (sql == null || sql.trim().equals("") || args == null) {
            return -1;
        }
        int id = -1;
        // 使用try-with-resource语句，自动关闭资源
        try (Connection connection = JdbcUtil.getConnection();
             PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
            for (int i = 0; i < args.length; i++) {
                preparedStatement.setObject(i + 1, args[i]);
            }
            int rows = preparedStatement.executeUpdate();
            // 如果刚才的sql语句是插入数据的sql语句，那么我们就需要拿到刚刚插入的数据的id
            if (sql.trim().toUpperCase().startsWith("INSERT")) {
                // 因为LAST_INSERT_ID()函数只对当前连接有效，所以需要传入当前使用的connection对象
                id = this.getLastInsertId(connection);
            } else {
                id = rows;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return id;
    }

    public ResultSet queryData(String sql, Object... args) {
        // 使用CachedRowSet缓存结果集避免关闭连接后无法访问结果集
        CachedRowSetImpl resultSet = null;
        // 使用try-with-resource语句，自动关闭资源
        try (Connection connection = JdbcUtil.getConnection();
             PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
            for (int i = 0; i < args.length; i++) {
                preparedStatement.setObject(i + 1, args[i]);
            }
            resultSet = new CachedRowSetImpl();
            resultSet.populate(preparedStatement.executeQuery());
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return resultSet;
    }

    // 获取刚刚插入的数据的id
    private int getLastInsertId(Connection connection) {
        String sql = "SELECT LAST_INSERT_ID()";
        ResultSet rs = null;
        try {
            // 因为LAST_INSERT_ID()函数只对当前连接有效，所以需要使用传入的connection
            rs = connection.prepareStatement(sql).executeQuery();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        int id = -1;
        if (rs != null) {
            try {
                if (rs.next()) {
                    id = rs.getInt(1);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return id;
    }
}
